const nodemailer = require('nodemailer');
const User = require('../models/User');
const { Op } = require('sequelize');
require('dotenv').config();

// 配置邮件传输器
const transporter = nodemailer.createTransport({
  host: process.env.SMTP_HOST,
  port: process.env.SMTP_PORT || 587,
  secure: process.env.SMTP_SECURE === 'true',
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS
  }
});

/**
 * 发送面试邀请通知
 * @param {Object} options - 通知选项
 * @param {number} options.userId - 求职者ID
 * @param {number} options.jobId - 职位ID
 * @param {string} options.interviewTime - 面试时间
 * @param {string} options.location - 面试地点
 * @param {string} options.notes - 备注信息
 */
exports.sendInterviewNotification = async (options) => {
  try {
    // 获取求职者信息
    const user = await User.findByPk(options.userId);
    if (!user || !user.email) {
      console.error('无法发送面试通知：用户邮箱不存在');
      return;
    }

    // 邮件内容
const mailOptions = {
  from: `"招聘系统" <${process.env.SMTP_FROM}>`,
  to: user.email,
  subject: '面试邀请通知',
  html: `
    <h2>面试邀请</h2>
    <p>尊敬的${user.fullName || user.username}：</p>
    <p>您申请的职位（职位ID：${options.jobId}）已通过初筛，邀请您参加面试。</p>
    <p><strong>面试时间：</strong>${new Date(options.interviewTime).toLocaleString()}</p>
    <p><strong>面试地点：</strong>${options.location}</p>
    ${options.notes ? `<p><strong>备注：</strong>${options.notes}</p>` : ''}
    <p>请准时参加，如有疑问请联系企业HR。</p>
    <p>此致<br>招聘系统</p>
  `
}

    // 发送邮件
    await transporter.sendMail(mailOptions);
    console.log(`面试通知已发送至 ${user.email}`);

    // TODO: 实现短信通知功能（如需）
  } catch (error) {
    console.error('发送面试通知失败:', error.message);
  }
};


/**
 * 发送职位申请状态更新通知
 * @param {Object} options - 通知选项
 * @param {number} options.userId - 用户ID
 * @param {number} options.jobId - 职位ID
 * @param {number} options.applicationId - 申请ID
 * @param {string} options.status - 申请状态
 * @param {string} [options.feedback] - 反馈信息
 * @param {string} [options.applicantName] - 申请人姓名（企业通知用）
 */
exports.sendApplicationNotification = async (options) => {
  try {
    let user, subject, content;

    // 区分通知类型：求职者通知或企业通知
    if (options.status) {
      // 求职者：申请状态更新通知
      user = await User.findByPk(options.userId);
      if (!user || !user.email) {
        console.error('无法发送申请状态通知：用户邮箱不存在');
        return;
      }

      const statusMap = {
        'pending': '待处理',
        'reviewing': '审核中',
        'interview': '面试邀请',
        'offer': '录用通知',
        'rejected': '未通过'
      };

      subject = `职位申请状态更新 - ${statusMap[options.status]}`;
      content = `
        <h2>职位申请状态更新</h2>
        <p>尊敬的${user.fullName || user.username}：</p>
        <p>您申请的职位（职位ID：${options.jobId}）状态已更新为：<strong>${statusMap[options.status]}</strong></p>
        ${options.feedback ? `<p><strong>企业反馈：</strong>${options.feedback}</p>` : ''}
        ${options.status === 'interview' ? `<p><strong>面试时间：</strong>${new Date(options.interviewTime).toLocaleString()}</p>` : ''}
        ${options.status === 'interview' ? `<p><strong>面试地点：</strong>${options.interviewLocation}</p>` : ''}
        <p>您可以登录系统查看详细信息。</p>
        <p>此致<br>招聘系统</p>
      `;
    } else {
      // 企业：新申请通知
      user = await User.findByPk(options.companyId);
      if (!user || !user.email) {
        console.error('无法发送新申请通知：企业用户邮箱不存在');
        return;
      }

      subject = '新的职位申请通知';
      content = `
        <h2>新的职位申请</h2>
        <p>尊敬的${user.companyName || user.username}：</p>
        <p>您发布的职位（职位ID：${options.jobId}）收到了新的申请。</p>
        <p><strong>申请人：</strong>${options.applicantName}</p>
        <p><strong>申请ID：</strong>${options.applicationId}</p>
        <p>请登录系统查看并处理。</p>
        <p>此致<br>招聘系统</p>
      `;
    }

    // 发送邮件
    const mailOptions = {
        from: `"招聘系统" <${process.env.SMTP_FROM}>`,
        to: user.email,
        subject: subject,
        html: content
      };

      await transporter.sendMail(mailOptions);
      console.log(`申请状态通知已发送至 ${user.email}`);
    } catch (error) {
      console.error('发送申请状态通知失败:', error.message);
    }
};


/**
 * 发送系统公告通知
 * @param {Object} options - 公告选项
 * @param {string} options.title - 公告标题
 * @param {string} options.content - 公告内容
 * @param {string[]} [options.userIds] - 指定用户ID列表，为空则发送给所有用户
 */
exports.sendAnnouncementNotification = async (options) => {
  try {
    // 查询需要发送的用户
    let users;
    if (options.userIds && options.userIds.length > 0) {
      users = await User.findAll({
        where: {
          id: { [Op.in]: options.userIds },
          email: { [Op.not]: null }
        }
      });
    } else {
      users = await User.findAll({
        where: {
          email: { [Op.not]: null }
        }
      });
    }

    if (!users || users.length === 0) {
      console.error('没有找到可发送公告的用户');
      return;
    }

    // 邮件内容基础配置
    const mailOptions = {
      from: `"招聘系统" <${process.env.SMTP_FROM}>`
    };

    // 批量发送邮件
    for (const user of users) {
      mailOptions.to = user.email;
      mailOptions.subject = options.title;
      mailOptions.html = `
        <h2>${options.title}</h2>
        <p>${options.content}</p>
        <p>此致<br>招聘系统</p>
      `;
      await transporter.sendMail(mailOptions);
      console.log(`系统公告已发送至 ${user.email}`);
    }
  } catch (error) {
    console.error('发送系统公告失败:', error.message);
  }
};
